package day230520;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/5/20 22:22
 * 顺时针打印矩阵
 */
public class Solution {

    public int[] clockwisePrint(int[][] mat, int n, int m) {
        // 定义左上角和右下角的位置
        int x1 = 0;
        int y1 = 0;
        int x2 = n - 1;
        int y2 = m - 1;
        // 模拟顺时针打印
        int[] ret = new int[m * n];
        int index = 0;
        while (index < ret.length) {
            // 打印顶部行
            for (int i = y1; i <= y2; i++) {
                ret[index++] = mat[x1][i];
            }
            // 打印最右侧列
            for (int i = x1 + 1; i <= x2; i++) {
                ret[index++] = mat[i][y2];
            }
            // 至少含有两行的情况下, 才需要打印最底部行
            if (x2 > x1) {
                for (int i = y2 - 1; i >= y1; i--) {
                    ret[index++] = mat[x2][i];
                }
            }
            // 至少有两列的情况下, 才需要打印最左侧列
            if (y2 > y1) {
                for (int i = x2 - 1; i >= x1 + 1; i--) {
                    ret[index++] = mat[i][y1];
                }
            }
            // 更新边界
            x1++;
            y1++;
            x2--;
            y2--;
        }
        return ret;
    }
}
